using System;
using System.Collections.Generic;
using System.Transactions;

using PMServiceDesk.DataAccess;
using PMServiceDesk.DataType;
using PMServiceDesk.Utils.ManejoDatos;
using PMServiceDesk.Parameters.Constantes;

namespace PMServiceDesk.BusinessLogic
{
    public class PaqueteTrabajoLogic
    {
        #region Variables

        private PaqueteTrabajoData _paqueteTrabajoData;

        #endregion

        #region Constructores

        public PaqueteTrabajoLogic()
        {
            _paqueteTrabajoData = new PaqueteTrabajoData();
        }

        #endregion

        #region Metodos

        public PaqueteTrabajoType CargarPorId(string id)
        {
            _paqueteTrabajoData.FiltrarPorId(id);

            return _paqueteTrabajoData.Cargar();
        }

        public void Grabar(PaqueteTrabajoType paqueteTrabajo)
        {
            _paqueteTrabajoData.Grabar(paqueteTrabajo);
        }

        public PaqueteTrabajoType GrabarPorLineaBaseDetalle(LineaBaseType lineaBase,LineaBaseDetalleType lineaDetalle,LineaBaseImportarType lineaImportar)
        {
            PaqueteTrabajoType tarea = this.CargarPorCodigoCuenta(lineaBase.ProyectoId, lineaDetalle.CodigoCuenta);

            if (tarea == null)
            {
                tarea = new PaqueteTrabajoType();
                tarea.PorcentajeAvance = 0;
            }

            tarea.ProyectoId = lineaBase.ProyectoId;
            tarea.TipoPaqueteTrabajoId = lineaImportar.TipoPaqueteTrabajoId;
            tarea.UsuarioResponsableId = lineaImportar.RecursoResponsableId;
            tarea.EstadoPaqueteTrabajoId = lineaImportar.EstadoPaqueteTrabajoId;
            tarea.CodigoCuenta = lineaDetalle.CodigoCuenta;
            tarea.Nombre = lineaDetalle.Nombre;
            tarea.FechaInicioProyectado = ConvertFormat.Date_To_Char(lineaDetalle.FechaInicioProyectado);
            tarea.FechaFinProyectado = ConvertFormat.Date_To_Char(lineaDetalle.FechaFinProyectado);

            this.Grabar(tarea);

            return tarea;
        }

        public string InicializarWorkflow(PaqueteTrabajoType registro)
        {
            PaqueteTrabajoType p = this.CargarPorId(registro.Id);

            p.UsuarioAsignadoId = registro.UsuarioAsignadoId;
            p.FechaInicioReal = ConvertFormat.Date_To_Char(DateTime.Now);

            using (TransactionScope transaccion = new TransactionScope())
            {
                this.Grabar(p);

                InteresadoPaqueteTrabajoType i = new InteresadoPaqueteTrabajoType();
                i.PaqueteTrabajoId = registro.Id;
                i.UsuarioInteresadoId = registro.UsuarioAsignadoId;
                i.UsuarioRegistroId = registro.UsuarioRegistroId;

                new InteresadoPaqueteTrabajoLogic().GrabarInteresadosLineaBase(i);

                HistorialEstadoPaqueteTrabajoType h = new HistorialEstadoPaqueteTrabajoType();
                h.PaqueteTrabajoId = registro.Id;
                h.UsuarioRegistroId = registro.UsuarioRegistroId;
                h.EstadoPaqueteTrabajoId = p.EstadoPaqueteTrabajoId;
                h.Comentario = "Se inicio la tarea";
                h.FechaRegistro = DateTime.Now;

                new HistorialEstadoPaqueteTrabajoLogic().Grabar(h);

                transaccion.Complete();
            }

            return registro.Id;
        }


        public string RegistrarComentarioFinalizar(ComentarioPaqueteTrabajoType registro)
        {
            PaqueteTrabajoType p = this.CargarPorId(registro.PaqueteTrabajoId);

            p.EstadoPaqueteTrabajoId = registro.EstadoPaqueteTrabajoDestinoId;

            using (TransactionScope transaccion = new TransactionScope())
            {
                new ComentarioPaqueteTrabajoLogic().Grabar(registro);

                this.Grabar(p);

                InteresadoPaqueteTrabajoType i = new InteresadoPaqueteTrabajoType();
                i.PaqueteTrabajoId = registro.Id;
                i.UsuarioInteresadoId = registro.UsuarioAsignadoId;
                i.UsuarioRegistroId = registro.UsuarioRegistroId;

                new InteresadoPaqueteTrabajoLogic().GrabarInteresadosLineaBase(i);

                HistorialEstadoPaqueteTrabajoType h = new HistorialEstadoPaqueteTrabajoType();
                h.PaqueteTrabajoId = p.Id;
                h.UsuarioRegistroId = registro.UsuarioRegistroId;
                h.EstadoPaqueteTrabajoId = p.EstadoPaqueteTrabajoId;
                h.Comentario = registro.Comentario;
                h.FechaRegistro = DateTime.Now;

                new HistorialEstadoPaqueteTrabajoLogic().Grabar(h);

                transaccion.Complete();
            }

            return p.Id;
        }

        public List<PaqueteTrabajoType> CargarExplorador(string id,string codigoCuenta)
        {
            if(id != "") _paqueteTrabajoData.FiltrarPorId(id);
            if(codigoCuenta != "") _paqueteTrabajoData.FiltrarPorCodigoCuenta(codigoCuenta);

            return _paqueteTrabajoData.CargarListaVista();
        }

        public PaqueteTrabajoType CargarPorCodigoCuenta(string proyectoId,string codigoCuenta)
        {
            _paqueteTrabajoData.FiltrarPorProyectoId(proyectoId);
            _paqueteTrabajoData.FiltrarPorCodigoCuenta(codigoCuenta);

            return _paqueteTrabajoData.Cargar();
        }

        public List<PaqueteTrabajoType> CargarExploradorPaginado(PaqueteTrabajoType registroBusqueda, int paginaActual = 0, int cantidadMostrar = 0, string orderBy = "")
        {
            _paqueteTrabajoData.FiltrarPorProyectoId(registroBusqueda.ProyectoId);
            _paqueteTrabajoData.FiltrarPorUsuarioInteresadoId(registroBusqueda.UsuarioInteresadoId);
            _paqueteTrabajoData.FiltrarPorRolUsuarioInteresadoId(registroBusqueda.RolUsuarioInteresadoId);

            if (registroBusqueda.TipoPaqueteTrabajoId != "") _paqueteTrabajoData.FiltrarPorTipoPaqueteTrabajoId(registroBusqueda.TipoPaqueteTrabajoId);
            if (registroBusqueda.EstadoPaqueteTrabajoId != "") _paqueteTrabajoData.FiltrarPorEstadoPaqueteTrabajoId(registroBusqueda.EstadoPaqueteTrabajoId);
            if (registroBusqueda.UsuarioResponsableId != "") _paqueteTrabajoData.FiltrarPorUsuarioResponsableId(registroBusqueda.UsuarioResponsableId);
            if (registroBusqueda.UsuarioAsignadoId != "")
            {
                if (registroBusqueda.UsuarioAsignadoId == "0")
                    _paqueteTrabajoData.FiltrarPorSinAsignacion();
                else
                    _paqueteTrabajoData.FiltrarPorUsuarioAsignadoId(registroBusqueda.UsuarioAsignadoId);
            }

            if (registroBusqueda.TipoBusquedaFecha != "" && registroBusqueda.FechaInicioProyectado != "" && registroBusqueda.FechaFinProyectado != "")
            {
                DateTime fechaDesde = ConvertFormat.Char_To_Date(registroBusqueda.FechaInicioProyectado);
                DateTime fechaHasta = ConvertFormat.Char_To_Date(registroBusqueda.FechaFinProyectado).AddDays(1);

                switch (registroBusqueda.TipoBusquedaFecha)
                {
                    case TipoBusqueda.Proyecto_FechaInicioEstimado:
                        _paqueteTrabajoData.FiltrarPorFechaInicioProyectado(fechaDesde, fechaHasta);
                        break;
                    case TipoBusqueda.Proyecto_FechaFinEstimado:
                        _paqueteTrabajoData.FiltrarPorFechaFinProyectado(fechaDesde, fechaHasta);
                        break;
                    case TipoBusqueda.Proyecto_FechaInicioReal:
                        _paqueteTrabajoData.FiltrarPorFechaInicioReal(fechaDesde, fechaHasta);
                        break;
                    case TipoBusqueda.Proyecto_FechaFinReal:
                        _paqueteTrabajoData.FiltrarPorFechaFinReal(fechaDesde, fechaHasta);
                        break;
                }
            }

            if (registroBusqueda.CodigoCuenta != "") _paqueteTrabajoData.FiltrarPorCodigoCuentaLike(registroBusqueda.CodigoCuenta);
            if (registroBusqueda.Nombre != "") _paqueteTrabajoData.FiltrarPorNombre(registroBusqueda.Nombre);

            return _paqueteTrabajoData.CargarListaVista(paginaActual, cantidadMostrar, orderBy);
        }

        #endregion
    }
}
